package com.xtm.exercise.base.B13getCatalog;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

/**
 * 获取源文件目录结构
 * 使用java编程获取本地文件夹内的的目录结构并把结构写到文件中，本示例包括获取文件和目录以及获取单独获取目录
 */
public class GetCatalog {

    private static int count=0;

    public static void main(String[] args) {

        //1.获取目录
        File file = new File("D:\\workspace\\one-project");
        String fileName1 = getFileName();
        getCatalogAndFile(file,fileName1);

        //强制停留1秒
        try{
            Thread.sleep(1000);
        }catch(Exception e){
            System.exit(0);//退出程序
        }

        String fileName2 = getFileName();
        getCataLog(file,fileName2);
    }


    /**
     * 获取目录以及目录内的文件名
     * @param file
     * @param fileName
     */
    public static void getCatalogAndFile(File file,String fileName){
        //System.out.println(makeSpace(count)+"|_"+file.getName());//输出位置也很重要，必须在头部
        pringTofile(file,fileName);
        //3.获取这个路径的下所有的文件以及目录
        File[] fil=file.listFiles();
        //4.判断里面是目录。使用递归继续遍历
        if(fil!=null&&fil.length>0){
            count++;//如果是目录加1
            //5，说明是目录利用递归继续遍历
            for(File fi:fil){
                getCatalogAndFile(fi,fileName);
            }
            count--;//上面遍历加1以后还得退回来。继续遍历
        }
    }

    /**
     * 获取目录
     * @param file
     * @param fileName
     */
    public static void getCataLog(File file,String fileName){
        System.out.println(makeSpace(count)+"|_"+file.getName());//输出位置也很重要，必须在头部
        pringTofile(file,fileName);
        //3.获取这个路径的下所有的文件以及目录
        File[] fil=file.listFiles();
        //4.判断里面是目录。使用递归继续遍历
        if(fil!=null&&fil.length>0){
            count++;//如果是目录加1
            //5，说明是目录利用递归继续遍历
            for(File fi:fil){
                if(fi.isDirectory()){
                    getCataLog(fi,fileName);
                }
            }
            count--;//上面遍历加1以后还得退回来。继续遍历
        }
    }

    /**
     * 让目录有层次感，必须有一个标记。
     * @param count
     * @return
     */
    public static String  makeSpace(int count){
        //创建空格字符串
        String spack="";
        for(int i=0;i<count;i++){
            spack+="  ";
        }
        return spack;
    }

    /**
     * 把输出内容写入文件
     * @param file
     * @param fileName
     */
    public static void pringTofile(File file,String fileName){
        FileWriter fw = null;
        try {
            fw = new FileWriter("D:\\workspace\\a\\"+fileName+".txt", true);//路径一定要用"\\"
            fw.write(makeSpace(count)+"|_"+file.getName()+"\r\n");
            fw.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fw != null) {
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 通过时间来制作文件名称
     * @return
     */
    public static String getFileName(){
        Date date = new Date();
        String s = "";
        StringBuilder fileName = new StringBuilder();
        s = String.format("%tY", date);
        fileName.append(s);
        s = String.format("%tm", date);
        fileName.append(s);
        s = String.format("%td", date);
        fileName.append(s);
        s = String.format("%tH", date);
        fileName.append(s);
        s = String.format("%tM", date);
        fileName.append(s);
        s = String.format("%tS", date);
        return fileName.append(s).toString();
    }
}
